package com.birdboot.core;

import com.birdboot.http.HttpServletRequest;
import com.birdboot.http.HttpServletResponse;

import javax.activation.MimetypesFileTypeMap;
import java.io.File;
import java.net.URISyntaxException;
/**
 * V8新增能容:
 * DispatcherServlet是由SpringMVC框架提供的一个Servlet类,用于与Tomcat整合使用的类.
 * 具体作用是接收处理请求的工作
 *
 * 这里我们先将原ClientHandler中处理请求的所有工作移动到这个类的service方法上
 * 注:
 * Tomcat中处理请求的类都需要继承HttpServlet,而实现类都需要重写方法:service,用于处理请求
 * SpringMVC提供的DispatcherServlet实际上也这样做了.我们这里不需要真的去继承了,但是格式上
 * 与其保持一致.
 */
public class DispatcherServlet {

    private static DispatcherServlet instance = new DispatcherServlet();

    private static File baseDir;
    private static File staticDir;
    static{
        try {
            baseDir = new File(
                    DispatcherServlet.class.getClassLoader()
                            .getResource(".").toURI()
            );
            //根据类加载路径定位其中的static目录
            staticDir = new File(baseDir,"static");
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
    }

    private DispatcherServlet(){}

    public static DispatcherServlet getInstance(){
        return instance;
    }

    public void service(HttpServletRequest request, HttpServletResponse response){
        String path = request.getUri();
        //System.out.println("抽象路径："+path);
        if("/".equals(path)){
            path = "/index.html";
        }
        File file = new File(staticDir,path);
        //状态行信息

        if(file.isFile()){
            response.setContentFile(file);
            /*
                V10新增内容:根据正文文件类型设置对应的Content-Type
                下面的代码被移动到了上面response.setContentFile(file)这个方法中了
                因为响应中只要有正文就应当有Content-Type和Content-Length这两个头.
                所以只要设置了正文就在该方法中自动添加这两个头即可.
                同样的,下面else的404中也删除这两个头的添加
             */
            response.addHeader("Server","BirdServer");
        }else{
            //重定向404页面
            file = new File(staticDir,"404.html");
            response.setContentFile(file);

            response.setStatusCode(404);
            response.setStatusReason("NotFound");

            response.addHeader("Server","BirdServer");

        }

    }
}
